package modelo;

import vista.VistaFactory;
import vista.VistaMovil;
import ar.uba.fi.algo3.titiritero.Posicionable;
import modelo.armas.BalasAlgo42;
import modelo.armas.BalasEnemigas;
import modelo.armas.PickUp;
import modelo.armas.RadarAlgo42;
import modelo.armas.RadarEnemigo;
import modelo.desplazadores.Desplazadores;
import modelo.naves.NaveAlgo42;
import modelo.naves.NavesAutonomas;
import modelo.util.Vector;

public abstract class Movil implements Posicionable{
	
	protected float radio = 1;
	protected Puntos puntos = new PuntosSimples (0);
	protected Desplazadores desplazador;
	
	public abstract Movil actuar();
	public abstract boolean seguirActuando();
	
	public abstract void chocarConAlgo42(NaveAlgo42 algo42);
	public abstract void chocarConBalaEnemiga(BalasEnemigas unaBala);
	public abstract void chocarConBalaAlgo42(BalasAlgo42 unaBala);
	public abstract void chocarConNaveAutonoma(NavesAutonomas unaNave);
	public abstract void chocarConPickUp(PickUp unPickUp);
	public abstract void chocarConRadarEnemigo (RadarEnemigo unRadar);
	public abstract void chocarConRadarAlgo42 (RadarAlgo42 unRadar);
	public abstract void chocarCon(Movil obj);
	
	public float getRadio(){
		return radio;
	}
	
	public float distancia(Movil obj){
		//Norma de la resta de vectores = distancia
		return this.getPosicion().restar(obj.getPosicion()).norma();
	}
	
	public boolean chocaCon(Movil obj){
		//Un mejor nombre seria buscarColision
		if (radio + obj.getRadio() > this.distancia(obj)) return true;
		return false;
	}
	
	public int getPuntos(int valor){
		return puntos.getPuntos(valor);
	}
	
	/*
	 * por defecto los moviles no dejan nuevos objetos al morir.
	 */
	public boolean dejaNuevoObjetoAlMorir() {
		return false;
	}
	
	/*
	 * para los objetos que no dejan algun objeto al morir,
	 * este objeto no deberia ser llamado nunca.
	 */
	public Movil dejarNuevoObjetoAlMorir() {
		return null;
	}
	
	public Vector getPosicion(){
		return (desplazador.getPosicion());
	}
	
	public Vector getDireccion(){
		return (desplazador.getDireccion());
	}
	
	public void setVelocidad(float vel){
		desplazador.setVelocidad(vel);
	}
	
	public void mover(){
		desplazador.mover();
	}
	
	public void setDesplazador (Desplazadores desplazador){
		this.desplazador = desplazador;
	}

	public int getX() {
		return ((Float)(getPosicion().getx()-radio)).intValue();
	}

	public int getY() {
		return ((Float)(getPosicion().gety()-radio)).intValue();
	}
	
	public String toString (){
		return String.format("%s POSICION: %s", this.getClass(), this.getPosicion() );
	}
	
	public VistaMovil getVista (VistaFactory vistaFactory){
		return vistaFactory.getVista(this);
	}
	
}
